package com.hy.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.hy.Result.ResponseResult;
import com.hy.deepSeek.DeepSeekRequest;
import com.hy.vo.Ciku;
import okhttp3.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/ai")
public class DeepSeekController {
    //            messages.add(new DeepSeekRequest.Message("这次对话是关于健康医疗的，你是一个医疗小程序的客服，一款革新医疗体验的一站式服务应用。" +
//                    "它打破传统就医壁垒，通过与各大城市优质医院的深度合作，用户无需再早起排队，动动手指就能在 APP 上快速预约心仪的医院和医生，" +
//                    "并灵活选择就诊时段，还能享受实时排队提醒，在线完成费用支付，极大简化就医流程。\n" +
//                    "APP 搭建了专业的在线问诊平台，汇聚各领域资深医生，支持一对一咨询，" +
//                    "让用户足不出户就能获取专业医疗建议。此外，它具备强大的健康管理功能，能记录身高、体重等健康数据并生成报告，" +
//                    "提供个性化健康计划。与正规药房合作的药品配送服务，解决买药难题，还提供药品信息查询与用药提醒。" +
//                    "无论你是忙碌的上班族、行动不便的老人，还是注重健康管理的人群，荷叶健康都能满足你的需求，守护你的健康。", "system"));


    // DeepSeek本地地址
    private static final String URL = "http://127.0.0.1:11434/api/chat";

    // 设置文件路径
    private static final String CIKU_FILE_PATH = "C:\\Users\\86132\\Desktop\\荷叶健康\\lotus-leaf-health\\lotus-leaf-health\\lotus-leaf-health-service\\lotus-leaf-health-AppService\\src\\main\\resources\\ciku.json";

    // 读取ciku.json文件
    private Ciku loadCiku() {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.readValue(new File(CIKU_FILE_PATH), Ciku.class);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }


    @PostMapping
    public ResponseResult ai(@RequestParam("message") String message) {
        System.out.println(message);
        try {
            // 加载词库
            Ciku ciku = loadCiku();
            if (ciku == null) {
                return ResponseResult.errorResult(400, "无法加载词库");
            }

            // 先检查是否有固定答案
            String fixedAnswer = checkForFixedAnswer(message, ciku);
            if (fixedAnswer != null) {
                // 如果找到了固定答案，延时五秒后返回
                try {
                    // 延迟五秒（5000毫秒）
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    // 处理中断异常
                }

                // 延迟后返回固定答案
                return ResponseResult.okResult(200, "固定答案", fixedAnswer);
            }

            // 如果没有固定答案，继续使用AL进行推理
            DeepSeekRequest requestObject = new DeepSeekRequest();
            List<DeepSeekRequest.Message> messages = new ArrayList<>();

            // 系统消息，提供关于健康医疗应用的详细描述
            messages.add(new DeepSeekRequest.Message("这次对话是关于线上健康医疗服务APP的，你的身份是一个医疗小程序的客服。", "system"));

            // 用户消息
            messages.add(new DeepSeekRequest.Message(message, "user"));

            // 设置请求对象的消息内容
            requestObject.setMessages(messages);

            // 设置模型和其他请求配置参数
            requestObject.setModel("deepseek-r1:8b");   // 设置使用的模型
            requestObject.setFrequency_penalty(0);      // 设置频率惩罚系数
            requestObject.setMax_tokens(2048);          // 设置最大token数
            requestObject.setPresence_penalty(0);      // 设置存在性惩罚系数
            requestObject.setResponse_format(new DeepSeekRequest.ResponseFormat("text"));  // 设置响应格式为文本
            requestObject.setStop(null);    // 设置停止标志为null
            requestObject.setStream(false); // 不使用流式输出
            requestObject.setStream_options(null);  // 流式选项为null
            requestObject.setTemperature(1);    // 设置温度值为1，控制生成的多样性
            requestObject.setTop_p(1);          // 设置top_p值为1
            requestObject.setTools(null);       // 没有使用任何工具
            requestObject.setTool_choice("none");   // 工具选择为无
            requestObject.setLogprobs(false);   // 不返回log概率
            requestObject.setTop_logprobs(null);  // 不设置top_logprobs

            // 使用Gson将请求对象转换为JSON字符串
            Gson gson = new Gson();
            String jsonBody = gson.toJson(requestObject);

            // 创建OkHttpClient实例，并设置连接、读取、写入超时时间
            OkHttpClient client = new OkHttpClient.Builder()
                    .connectTimeout(300, java.util.concurrent.TimeUnit.SECONDS)  // 设置连接超时为300秒
                    .readTimeout(300, java.util.concurrent.TimeUnit.SECONDS)  // 设置读取超时为300秒
                    .writeTimeout(300, java.util.concurrent.TimeUnit.SECONDS)  // 设置写入超时为300秒
                    .build();  // 构建OkHttpClient实例

            // 设置请求体的媒体类型为JSON
            MediaType mediaType = MediaType.parse("application/json");
            // 使用JSON字符串创建请求体
            RequestBody body = RequestBody.create(mediaType, jsonBody);

            // 创建HTTP POST请求
            Request request = new Request.Builder()
                    .url(URL)
                    .method("POST", body)
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Accept", "application/json")
                    .build();

            // 发送请求并获取响应
            Response response = client.newCall(request).execute();
            // 获取响应内容
            String responseBody = response.body().string();

            // 返回响应结果
            return ResponseResult.okResult(200, "回答成功!", responseBody);

        } catch (IOException e) {
            // 捕获异常并返回失败
            e.printStackTrace();
            return ResponseResult.errorResult(400, "请求DeepSeek接口失败");
        }
    }

    // 检查是否有固定答案
    private String checkForFixedAnswer(String message, Ciku ciku) {
        // 遍历词库，查找是否有匹配的答案
        for (Ciku.Entry entry : ciku.getEntries()) {
            if (message.contains(entry.getKeyword())) {
                // 找到匹配的词库条目，返回固定答案
                return entry.getAnswer();
            }
        }
        return null; // 如果没有找到匹配的条目，返回null
    }


//    // DeepSeek本地地址
//    private static final String URL = "http://127.0.0.1:11434/api/chat";
//
//    @PostMapping
//    public ResponseResult ai(@RequestParam("message") String message) {
//        System.out.println(message);
//        try {
//            // 创建DeepSeekRequest对象 属性注解均在实体类中
//            DeepSeekRequest requestObject = new DeepSeekRequest();
//            List<DeepSeekRequest.Message> messages = new ArrayList<>();
//
//            // 根据请求参数设置消息内容
//            messages.add(new DeepSeekRequest.Message("这次对话是关于一款线上医疗小程序的，荷叶健康医疗APP中的客服", "system"));
//            messages.add(new DeepSeekRequest.Message(message, "user"));
//            requestObject.setMessages(messages);
//
//            // 模型及其他配置
//            requestObject.setModel("deepseek-r1:8b");
//            requestObject.setFrequency_penalty(0);
//            requestObject.setMax_tokens(2048);
//            requestObject.setPresence_penalty(0);
//            requestObject.setResponse_format(new DeepSeekRequest.ResponseFormat("text"));
//            requestObject.setStop(null);
//            requestObject.setStream(false);
//            requestObject.setStream_options(null);
//            requestObject.setTemperature(1);
//            requestObject.setTop_p(1);
//            requestObject.setTools(null);
//            requestObject.setTool_choice("none");
//            requestObject.setLogprobs(false);
//            requestObject.setTop_logprobs(null);
//
//            // 使用Gson将请求对象转换为JSON字符串
//            Gson gson = new Gson();
//            String jsonBody = gson.toJson(requestObject);
//
//            // 创建OkHttpClient实例，并设置超时时间
//            OkHttpClient client = new OkHttpClient.Builder()
//                    .connectTimeout(300, java.util.concurrent.TimeUnit.SECONDS)
//                    .readTimeout(300, java.util.concurrent.TimeUnit.SECONDS)
//                    .writeTimeout(300, java.util.concurrent.TimeUnit.SECONDS)
//                    .build();
//
//            // 设置请求体的媒体类型为JSON
//            MediaType mediaType = MediaType.parse("application/json");
//            RequestBody body = RequestBody.create(mediaType, jsonBody);
//
//            // 创建HTTP POST请求
//            Request request = new Request.Builder()
//                    .url(URL)
//                    .method("POST", body)
//                    .addHeader("Content-Type", "application/json")
//                    .addHeader("Accept", "application/json")
//                    .build();
//
//            // 发送请求并获取响应
//            Response response = client.newCall(request).execute();
//            // 获取响应内容
//            String responseBody = response.body().string();
//
//            // 返回响应结果
//            return ResponseResult.okResult(200, "回答成功!", responseBody);
//
//        } catch (IOException e) {
//            // 捕获异常并返回失败
//            e.printStackTrace();
//            return ResponseResult.errorResult(400,"请求DeepSeek接口失败");
//        }
//    }

}
